Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

36장. NLB는 언제 쓰는가

이 장에서 말하고자 하는 것

ALB가 대부분의 HTTP 서비스를 책임진다.

그런데 어떤 상황에서는 ALB로 부족하다.

  • HTTP가 아닌 프로토콜이 필요할 때
  • 초저지연이 중요할 때
  • 고정 IP가 필요할 때

이때 등장하는 것이

NLB (Network Load Balancer)

다.

ALB의 대체가 아니라 다른 자리에 쓰는 LB 다.


1. NLB가 다른 점

NLB는 L4(TCP/UDP)에서 동작한다.

  • HTTP 헤더를 보지 않는다
  • 경로 · 호스트 라우팅을 못 한다
  • 그 대신 처리 지연이 매우 짧다 (100µs 수준)
  • 초당 수백만 연결을 처리한다
  • AZ마다 고정 IP를 가질 수 있다

2. NLB가 어울리는 상황

상황 1. 비-HTTP 프로토콜

  • WebSocket 일부
  • MQTT, AMQP
  • 게임용 TCP/UDP 트래픽
  • 일부 데이터베이스 프록시

상황 2. 고정 IP가 필요한 환경

방화벽 화이트리스트나
파트너사가 IP를 등록해야 하는 환경에서는
ALB의 가변 IP가 곤란하다.

NLB는 AZ마다 Elastic IP를 붙일 수 있다.

NLB AZ-A IP : 3.36.55.10
NLB AZ-B IP : 3.36.55.11

이 두 IP를 파트너에게 주면 끝난다.

상황 3. 초저지연이 중요한 서비스

거래소 · 실시간 시세 · 광고 입찰처럼
밀리초가 의미 있는 환경에서는 NLB를 쓴다.

상황 4. TLS 패스스루가 필요한 경우

암호화된 트래픽을 LB에서 안 풀고
그대로 뒤로 넘기고 싶을 때 NLB를 쓴다.


3. NLB가 어울리지 않는 상황

  • 일반적인 HTTP / HTTPS API → ALB
  • 경로 기반 라우팅이 필요한 경우 → ALB
  • 인증서를 LB에서 종료해 내부는 HTTP로 받고 싶은 경우 → ALB

“L7 라우팅이 필요하면 ALB” 가 기준선이다


4. ALB 앞에 NLB를 두는 패턴

가끔 NLB를 ALB 앞에 두는 구조가 나온다.

사용자 → NLB(고정 IP) → ALB(L7 라우팅) → ECS

이유:

  • 외부에는 고정 IP를 노출하고
  • 내부 라우팅은 ALB의 L7 능력을 그대로 쓰고 싶을 때

특수 요건이 없으면 굳이 따라할 필요는 없다.


5. 우리 서비스에서

이 책에서 만드는 MSA의 기본 구조에는 NLB가 없다.

CloudFront → API Gateway → ALB → ECS → DB

이걸로 충분하다.

NLB는 “특수 요건이 생기면 이름을 떠올리는 도구” 로 알아두면 된다.


6. 직접 확인해보기 — CLI

# NLB 만들기
aws elbv2 create-load-balancer \
  --name my-nlb \
  --type network \
  --subnets subnet-xxx subnet-yyy

ALB와 같은 elbv2 API를 쓰지만 --type network 가 다르다.


7. 코드로는 이렇게 생겼다 — Terraform

resource "aws_eip" "nlb_a" { domain = "vpc" }
resource "aws_eip" "nlb_b" { domain = "vpc" }

resource "aws_lb" "nlb" {
  name               = "my-nlb"
  internal           = false
  load_balancer_type = "network"

  subnet_mapping {
    subnet_id     = aws_subnet.public_a.id
    allocation_id = aws_eip.nlb_a.id    # 고정 IP
  }

  subnet_mapping {
    subnet_id     = aws_subnet.public_b.id
    allocation_id = aws_eip.nlb_b.id
  }
}

subnet_mapping 으로 AZ마다 Elastic IP를 지정해
고정 IP를 만들 수 있다.


8. 이렇게 쓰면 망한다 — 안티패턴

안티패턴 1. HTTP 서비스에 NLB를 기본으로 쓴다

경로 라우팅 · 호스트 라우팅 · 헤더 검사가 다 막힌다.
결국 애플리케이션에서 분기 코드를 짜게 된다.

HTTP라면 거의 항상 ALB

안티패턴 2. NLB에 보안 그룹이 없다고 가정한다

NLB에도 2023년부터 보안 그룹을 붙일 수 있다.
다만 ALB와 동작이 미묘하게 다르다.

NLB 뒷단 보안 그룹 규칙은 꼭 다시 점검한다

안티패턴 3. NLB로 TLS 패스스루를 한 뒤 뒷단에서 또 패스스루 한다

NLB(TLS 패스) → EC2(TLS 패스) → 어디서 종료할지 모름

TLS는 어딘가 한 곳에서 반드시 종료된다
패스스루의 끝을 명확히 설계해야 한다


9. 한 줄로 정리

NLB는 L4의 빠르고 단순한 LB이며,
HTTP가 아니거나 고정 IP가 필요할 때 등장한다


10. 이 장의 핵심 정리

  1. NLB는 L4에서 동작해 ALB와 다른 자리에 쓴다.
  2. HTTP / HTTPS API에는 거의 항상 ALB가 맞다.
  3. NLB는 고정 IP · 초저지연 · TLS 패스스루 · 비-HTTP 프로토콜이 필요할 때 고려한다.
  4. 우리 MSA 구조의 기본형에는 NLB가 없다.
  5. NLB는 도구 이름으로 기억해 두고, 요건이 생기면 그때 깊이 들여다본다.